#include "widget.h"
#include "ui_widget.h"
#include <QLabel>
#include <QPixmap>
#include <QDebug>
#include <QResizeEvent>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    QLabel*label1=new QLabel(this);
    QLabel*label2=new QLabel(this);
    QLabel*label3=new QLabel(this);

    //纯文本
    label1->setGeometry(0,0,200,100);
    label1->setTextFormat(Qt::PlainText);
    label1->setText("<b>这是一个纯文本</b>");

    //富文本
    //<b></b>是富文本中标记加粗的标签
    label2->setGeometry(0,200,200,100);
    label2->setTextFormat(Qt::RichText);
    label2->setText("<b>这是一个富文本</b>");

    //markdown文本
    //#：markdown文本中标记一级标题的标签
    label3->setGeometry(0,400,500,100);
    label3->setTextFormat(Qt::MarkdownText);
    label3->setText("# 这是一个maekdown文本");

    //使用QLabel显示图片(这是一次性设置的)
    //只是此图片不能随着拖动窗口大小改变图片大小
    label4=new QLabel(this);
    QRect windowsRect=this->geometry();
    label4->setGeometry(500,0,windowsRect.width()-500,windowsRect.height()-500);
    //管理图片信息qrc机制
    QPixmap pixmap(":/image.jpg");
    //将这个图片设置进入label4中
    label4->setPixmap(pixmap);
    //设置图片自动拉伸，铺满label4控件
    label4->setScaledContents(true);


    //将图片设置为随着用户拖动窗口大小，图片实时随之改变的效果
    /* 事件 -知识点
     * 在Qt中，用户的具体操作，对应一些信号。比如点击信号，选择信号，选中信号....
     * Qt中，表示用户的操作，一个是信号，一个是事件
     *
     * 当用户拖拽来窗口大小时，就会触发resize事件(resizeEvent)
     * resize事件是连续变化的，所以，把窗口尺寸从一个尺寸拖动改变为另一个尺寸的过程中，这个过程会触发一系列的resizeEvent事件
     * 此时，就可以借助resizeEvent来完成上述功能
     * 可以让Widget类来重写父类QWidget类中的resizeEvent虚函数
     * 这样的话，拖动窗口就会调用Widget类的resizeEvent函数。
     * 在鼠标拖动窗口改变尺寸的过程中，这个函数就会被反复执行调用
     * 每次触发一个resizeEvent事件都会去调用一次resizeEvent对应的虚函数
     * 由于此处进行了函数重写，通过父类的指针调用resizeEvent虚函数就会实际调用到子类resizeEvent对应的虚函数
     * 利用多态的性质
     *
     * 在实际的编程过程中，指定回调函数其实有很多做法：
     * 1、设置函数指针
     * 2、设置仿函数(函数对象)
     * 3、设置lambda表达式
     * 4、重写父类虚函数 (框架中拿着父类的指针调用这个函数，如果创建了子类重写了这个函数，此时在多态机制下，实际执行的就是子类重写的函数)
     * 5、Qt的信号槽机制
     *
    */

    /* alignment属性-设置文本的垂直水平位置
     * 水平方向
     * Qt::AlignLeft:左对齐
     * Qt::AlignRight:右对齐
     * Qt::AlignHCenter:水平居中
     * Qt::AlignJustify:两端对齐
     *
     * 垂直方向
     * Qt::AlignTop:顶部对齐
     * Qt::AlignBottom:底部对其
     * Qt::AlignVCenter:垂直居中
     * Qt::AlignBaseLine:基线对其
     *
    */
    /* 在Qt Creator右侧编辑区，可以看到类之间的继承关系
     * 从上到下，就是从父类->子类
     * 显示Label控件的边框
     *      找到QFrame控件的frameShape属性，设置为Box
     *
    */
    //设置对齐方式
    ui->label5->setText("Hello");
    //水平居中-垂直居中
    ui->label5->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);

    //设置自动换行
    ui->label6->setText("Hello World Hello World Hello World");
    ui->label6->setWordWrap(true);

    //设置缩进
    ui->label7->setText("Hello World Hello World Hello World");
    ui->label7->setWordWrap(true);//设置自动换行
    ui->label7->setIndent(20);//具体缩进的像素值

    //设置边距
    ui->label8->setText("Hello World Hello World Hello World");
    ui->label8->setWordWrap(true);//设置自动换行
    ui->label8->setMargin(10);

    //设置伙伴
    //将QLabel控件和QRadioButton单选按钮建立伙伴关系
    //选中对应的label控件之后，就选中了对应的单选按钮
    ui->label9->setBuddy(ui->radioButton1);
    ui->label10->setBuddy(ui->radioButton2);
    /* Qt中，QLabel控件中写的文本，可以指定快捷键
     * 这里的快捷键是固定写法
     * 在文本中使用&后跟快捷键字符
     * 例如:&A 表示 alt键+a，就表示选中了这个label控件，又因为伙伴关系，就选中了对应的QRadioButton单选按钮
     * 绑定伙伴关系之后，通过快捷键就可以选中对应的label,进而选中对应的伙伴控件(单选按钮/复选按钮)
    */
}

Widget::~Widget()
{
    delete ui;
}

// 此处的形参，QResizeEvent *event event中就包含了触发这个resize事件的这一时刻，窗口的尺寸的数值
void Widget::resizeEvent(QResizeEvent *event)
{
    qDebug()<<event->size();
    //通过这个event指针指向的size就可以获取这个label4控件的大小尺寸了
    //重新设置这个label4的尺寸大小，让其和改变的窗口的尺寸大小相同
    label4->setGeometry(500,0,event->size().width()-500,event->size().height()-500);

}

